#pragma once
_Pragma("once")

// #include <iostream>
// #include <tuple>
// #include <utility>
// #include <cmath>
// #include <algorithm>
// #include <vector>
// #include<functional>


//win64下用double型，arm32用float
#ifdef _win64系统
typedef double floatx;
#else 
typedef float floatx;
#endif

typedef struct 
{
    //单通道LMS

    std::vector<floatx> xn; //输入（向量）
    floatx dn; //期望（标量）
    floatx yn; //输出（标量）
    floatx en; //误差（标量）

    int N ; //阶数
    std::vector<floatx> w; //FIR系数（向量）

    floatx μ; //步长（标量）
    floatx tr_R ; //自相关矩阵迹
    //std::function<floatx(floatx,floatx,floatx)> μ更新;

}LMS_Struct;




// Function declaration
#ifdef __cplusplus
extern "C" {
#endif

    extern LMS_Struct *LMS_Struct_Creat();

    extern void NLMS_Run(
        LMS_Struct *p,
        int reset,
        int N,
        floatx x,
        floatx d,
        floatx *y,
        floatx *e,
        floatx *miu);

    extern int get_weight(const LMS_Struct *p, floatx *const pw, int N);

#ifdef __cplusplus
}
#endif




